#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
完整权限系统设计 - 结合PC端和微信小程序功能
共88个权限，支持细粒度的权限控制
"""

import sys
import os
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

from backend.infrastructure.database import db
from backend.models.role import Role
from backend.models.permission import Permission
from backend.models.role_permission import RolePermission

def init_complete_permissions():
    """初始化完整的权限系统"""
    
    # 完整权限列表设计
    permissions_data = [
        # ========== 用户管理权限 ==========
        ('user:read', '查看用户信息', '可以查看用户列表和详细信息'),
        ('user:create', '创建用户', '可以创建新用户账户'),
        ('user:edit', '编辑用户信息', '可以修改用户基本信息'),
        ('user:delete', '删除用户', '可以删除用户账户'),
        ('user:role_assign', '分配用户角色', '可以给用户分配和移除角色'),
        ('user:status_manage', '用户状态管理', '可以启用/禁用用户账户'),
        ('user:password_reset', '重置用户密码', '可以重置其他用户的密码'),
        
        # ========== 学生档案管理权限 ==========
        ('student:read', '查看学生档案', '可以查看学生列表和详细档案'),
        ('student:create', '创建学生档案', '可以录入新学生档案'),
        ('student:edit', '编辑学生档案', '可以修改学生基本信息'),
        ('student:delete', '删除学生档案', '可以删除学生档案'),
        ('student:import', '批量导入学生', '可以通过Excel批量导入学生数据'),
        ('student:export', '导出学生数据', '可以导出学生数据到Excel'),
        ('student:bind_manage', '学生绑定管理', '可以管理学生和家长的绑定关系'),
        
        # ========== 视力数据管理权限 ==========
        ('vision:read', '查看视力数据', '可以查看视力检测记录'),
        ('vision:create', '录入视力数据', '可以录入新的视力检测数据'),
        ('vision:edit', '编辑视力数据', '可以修改视力检测记录'),
        ('vision:delete', '删除视力数据', '可以删除视力检测记录'),
        ('vision:analyze', '视力数据分析', '可以进行视力数据分析和趋势预测'),
        ('vision:batch_import', '批量导入视力数据', '可以批量导入视力检测数据'),
        
        # ========== 干预记录管理权限 ==========
        ('intervention:read', '查看干预记录', '可以查看干预记录列表和详情'),
        ('intervention:create', '创建干预记录', '可以创建新的干预记录'),
        ('intervention:edit', '编辑干预记录', '可以修改干预记录'),
        ('intervention:delete', '删除干预记录', '可以删除干预记录'),
        ('intervention:execute', '执行干预任务', '可以执行和完成干预任务'),
        ('intervention:plan', '制定干预方案', '可以制定干预计划和方案'),
        ('intervention:review', '审核干预记录', '可以审核和确认干预记录'),
        
        # ========== 随访管理权限 ==========
        ('followup:read', '查看随访记录', '可以查看随访记录和计划'),
        ('followup:create', '创建随访记录', '可以创建新的随访记录'),
        ('followup:edit', '编辑随访记录', '可以修改随访记录'),
        ('followup:delete', '删除随访记录', '可以删除随访记录'),
        ('followup:schedule', '安排随访计划', '可以安排和调整随访计划'),
        ('followup:execute', '执行随访', '可以执行随访任务'),
        
        # ========== 报告管理权限 ==========
        ('report:read', '查看报告', '可以查看各类统计报告'),
        ('report:generate', '生成报告', '可以生成和导出报告'),
        ('report:template_manage', '报告模板管理', '可以管理报告模板'),
        ('report:schedule', '定时报告', '可以设置定时生成报告'),
        ('report:share', '分享报告', '可以分享报告给其他用户'),
        
        # ========== 微信小程序权限 ==========
        ('miniprogram:access', '小程序基础访问', '可以登录和使用小程序基本功能'),
        ('miniprogram:student_bind', '学生绑定', '可以在小程序中绑定学生'),
        ('miniprogram:vision_view', '查看视力数据', '可以在小程序中查看学生视力数据'),
        ('miniprogram:intervention_view', '查看干预记录', '可以在小程序中查看干预记录'),
        ('miniprogram:report_view', '查看报告', '可以在小程序中查看学生报告'),
        ('miniprogram:feedback', '反馈建议', '可以提交反馈和建议'),
        ('miniprogram:notification', '消息通知', '可以接收和查看系统通知'),
        
        # ========== 社交功能权限 ==========
        ('social:read', '查看社交内容', '可以查看社交分享内容'),
        ('social:create', '发布社交内容', '可以发布和分享内容'),
        ('social:comment', '评论互动', '可以评论和点赞'),
        ('social:moderate', '内容审核', '可以审核和管理社交内容'),
        
        # ========== 反馈管理权限 ==========
        ('feedback:read', '查看用户反馈', '可以查看用户反馈和建议'),
        ('feedback:reply', '回复用户反馈', '可以回复用户反馈'),
        ('feedback:resolve', '处理反馈', '可以标记反馈为已处理'),
        ('feedback:export', '导出反馈数据', '可以导出反馈统计数据'),
        
        # ========== 图表展示权限 ==========
        ('chart:read', '查看图表', '可以查看统计图表'),
        ('chart:create', '创建图表', '可以创建新的统计图表'),
        ('chart:edit', '编辑图表', '可以修改图表配置'),
        ('chart:export', '导出图表', '可以导出图表为图片或PDF'),
        
        # ========== 医生交流权限 ==========
        ('medical_consult:read', '查看医生交流', '可以查看医生咨询和交流内容'),
        ('medical_consult:create', '创建医生交流', '可以发起医生咨询'),
        ('medical_consult:reply', '回复医生交流', '可以回复医生咨询'),
        ('medical_consult:manage', '管理医生交流', '可以管理医生咨询内容'),
        
        # ========== 系统管理权限 ==========
        ('system:config', '系统配置', '可以修改系统配置参数'),
        ('system:dict_manage', '字典管理', '可以管理系统数据字典'),
        ('system:backup', '数据备份', '可以执行数据备份和恢复'),
        ('system:monitor', '系统监控', '可以查看系统运行状态'),
        ('system:manage', '系统管理', '可以进行系统管理操作'),
        
        # ========== 角色权限管理 ==========
        ('role:read', '查看角色', '可以查看角色列表和详情'),
        ('role:create', '创建角色', '可以创建新角色'),
        ('role:edit', '编辑角色', '可以修改角色信息'),
        ('role:delete', '删除角色', '可以删除角色'),
        ('role:permission_assign', '分配角色权限', '可以给角色分配权限'),
        ('role:manage', '角色管理', '可以管理角色，包括查看、创建、编辑、删除角色'),
        
        # ========== 权限管理 ==========
        ('permission:read', '查看权限', '可以查看权限列表'),
        ('permission:create', '创建权限', '可以创建新权限'),
        ('permission:edit', '编辑权限', '可以修改权限信息'),
        ('permission:delete', '删除权限', '可以删除权限'),
        ('permission:manage', '权限管理', '可以管理权限，包括查看、创建、编辑、删除权限'),
        
        # ========== 审计日志权限 ==========
        ('log:read', '查看操作日志', '可以查看系统操作日志'),
        ('log:export', '导出日志', '可以导出日志数据'),
        ('log:analyze', '日志分析', '可以进行日志统计分析'),
        
        # ========== 数据权限控制 ==========
        ('data:own_only', '仅查看自己数据', '只能查看自己创建或负责的数据'),
        ('data:department', '查看部门数据', '可以查看所在部门的数据'),
        ('data:all', '查看所有数据', '可以查看系统中所有数据'),
        ('data:export', '数据导出', '可以导出系统数据为Excel/PDF等格式'),
        
        # ========== 审核权限 ==========
        ('audit:role_application', '角色申请审核', '可以审核用户角色申请'),
        ('audit:data_change', '数据变更审核', '可以审核重要数据的变更'),
        ('audit:content', '内容审核', '可以审核用户发布的内容'),
    ]
    
    # 创建权限
    print("🔧 创建权限...")
    created_count = 0
    for code, name, description in permissions_data:
        permission = Permission.query.filter_by(code=code).first()
        if not permission:
            permission = Permission(
                code=code,
                name=name,
                description=description,
                status='active'
            )
            db.session.add(permission)
            created_count += 1
            print(f"  ✅ {code} - {name}")
    
    print(f"📊 创建了 {created_count} 个权限")
    
    # 角色及其权限分配
    roles_permissions = {
        'admin': {
            'description': '系统管理员 - 拥有系统所有权限',
            'permissions': [p[0] for p in permissions_data]  # 所有权限
        },
        
        'doctor': {
            'description': '医生 - 负责视力分析、干预方案制定、医学审核',
            'permissions': [
                # 学生档案
                'student:read', 'student:edit',
                # 视力数据
                'vision:read', 'vision:create', 'vision:edit', 'vision:analyze',
                # 干预管理
                'intervention:read', 'intervention:create', 'intervention:edit', 
                'intervention:plan', 'intervention:review',
                # 随访管理
                'followup:read', 'followup:create', 'followup:edit', 'followup:schedule',
                # 报告权限
                'report:read', 'report:generate', 'report:template_manage',
                # 图表权限
                'chart:read', 'chart:create', 'chart:edit', 'chart:export',
                # 医生交流权限
                'medical_consult:read', 'medical_consult:create', 'medical_consult:reply', 'medical_consult:manage',
                # 数据权限
                'data:all', 'data:export',
                # 日志查看
                'log:read'
            ]
        },
        
        'teacher': {
            'description': '教师 - 负责学生管理、干预执行、日常监测',
            'permissions': [
                # 学生档案
                'student:read', 'student:create', 'student:edit', 'student:bind_manage',
                # 视力数据
                'vision:read', 'vision:create', 'vision:edit',
                # 干预执行
                'intervention:read', 'intervention:create', 'intervention:edit', 'intervention:execute',
                # 随访执行
                'followup:read', 'followup:create', 'followup:edit', 'followup:execute',
                # 报告查看
                'report:read', 'report:generate',
                # 图表权限
                'chart:read', 'chart:export',
                # 数据权限（包含导出权限，便于班级管理）
                'data:department', 'data:export',
                # 日志查看
                'log:read'
            ]
        },
        
        'assistant': {
            'description': '助理医生/工作人员 - 负责数据录入、随访、用户反馈处理',
            'permissions': [
                # 学生档案
                'student:read', 'student:create', 'student:edit',
                # 视力数据录入
                'vision:read', 'vision:create', 'vision:edit', 'vision:batch_import',
                # 基础干预记录
                'intervention:read', 'intervention:create', 'intervention:edit',
                # 随访管理
                'followup:read', 'followup:create', 'followup:edit', 'followup:execute',
                # 反馈处理
                'feedback:read', 'feedback:reply', 'feedback:resolve',
                # 医生交流权限
                'medical_consult:read', 'medical_consult:create',
                # 基础报告
                'report:read',
                # 数据权限
                'data:department',
                # 小程序支持
                'miniprogram:access'
            ]
        },
        
        'parent': {
            'description': '家长 - 查看绑定学生信息，使用小程序功能',
            'permissions': [
                # 学生信息（仅绑定的）
                'student:read',
                # 视力数据查看
                'vision:read',
                # 干预记录查看
                'intervention:read',
                # 随访记录查看
                'followup:read',
                # 报告查看
                'report:read',
                # 小程序功能
                'miniprogram:access', 'miniprogram:student_bind', 'miniprogram:vision_view',
                'miniprogram:intervention_view', 'miniprogram:report_view', 'miniprogram:feedback',
                'miniprogram:notification',
                # 社交功能
                'social:read', 'social:create', 'social:comment',
                # 反馈功能
                'feedback:read',
                # 数据权限（仅自己相关）
                'data:own_only'
            ]
        },
        
        'registered_user': {
            'description': '注册用户 - 基础功能访问，可申请角色提升',
            'permissions': [
                # 小程序基础功能
                'miniprogram:access', 'miniprogram:feedback',
                # 社交功能
                'social:read',
                # 反馈功能
                'feedback:read',
                # 数据权限（仅自己）
                'data:own_only'
            ]
        },
        
        'guest': {
            'description': '访客 - 仅可查看公开信息',
            'permissions': [
                # 公开内容查看
                'social:read'
            ]
        }
    }
    
    # 创建角色和权限关联
    print("\n🏷️  创建角色和权限关联...")
    for role_name, role_data in roles_permissions.items():
        # 创建或更新角色
        role = Role.query.filter_by(name=role_name).first()
        if not role:
            role = Role(
                name=role_name,
                description=role_data['description'],
                status='active'
            )
            db.session.add(role)
            db.session.flush()
            print(f"  ✅ 创建角色: {role_name}")
        else:
            role.description = role_data['description']
            print(f"  🔄 更新角色: {role_name}")
        
        # 删除旧的权限关联
        RolePermission.query.filter_by(role_id=role.id).delete()
        
        # 创建新的权限关联
        permission_count = 0
        for perm_code in role_data['permissions']:
            permission = Permission.query.filter_by(code=perm_code).first()
            if permission:
                role_perm = RolePermission(
                    role_id=role.id,
                    permission_id=permission.id
                )
                db.session.add(role_perm)
                permission_count += 1
        
        print(f"    📋 分配了 {permission_count} 个权限")
    
    db.session.commit()
    print("\n✅ 完整权限系统初始化完成！")

def show_complete_permissions_matrix():
    """显示完整的权限矩阵"""
    print("\n" + "="*80)
    print("📊 完整权限矩阵")
    print("="*80)
    
    roles = Role.query.filter_by(status='active').order_by(Role.id).all()
    permissions = Permission.query.filter_by(status='active').order_by(Permission.code).all()
    
    # 按权限类别分组
    permission_groups = {}
    for perm in permissions:
        category = perm.code.split(':')[0]
        if category not in permission_groups:
            permission_groups[category] = []
        permission_groups[category].append(perm)
    
    # 打印每个类别的权限矩阵
    for category, perms in permission_groups.items():
        print(f"\n📂 {category.upper()} 权限")
        print("-" * 60)
        
        # 表头
        print(f"{'权限代码':<25} {'权限名称':<15} ", end="")
        for role in roles:
            print(f"{role.name:<12}", end=" ")
        print()
        print("-" * (45 + len(roles) * 13))
        
        # 权限行
        for perm in perms:
            print(f"{perm.code:<25} {perm.name:<15} ", end="")
            for role in roles:
                # 检查角色是否有此权限
                has_perm = any(
                    rp.permission_id == perm.id 
                    for rp in RolePermission.query.filter_by(role_id=role.id).all()
                )
                print(f"{'✓':<12}" if has_perm else f"{'×':<12}", end=" ")
            print()

def show_role_summary():
    """显示角色权限汇总"""
    print("\n" + "="*60)
    print("👥 角色权限汇总")
    print("="*60)
    
    roles = Role.query.filter_by(status='active').order_by(Role.id).all()
    
    for role in roles:
        role_perms = RolePermission.query.filter_by(role_id=role.id).all()
        perm_codes = []
        for rp in role_perms:
            perm = Permission.query.get(rp.permission_id)
            if perm:
                perm_codes.append(perm.code)
        
        print(f"\n🏷️  {role.name} ({len(perm_codes)}个权限)")
        print(f"   📝 {role.description}")
        
        # 按类别分组显示权限
        perm_groups = {}
        for code in perm_codes:
            category = code.split(':')[0]
            if category not in perm_groups:
                perm_groups[category] = []
            perm_groups[category].append(code.split(':')[1])
        
        for category, actions in perm_groups.items():
            print(f"   📂 {category}: {', '.join(actions)}")

if __name__ == '__main__':
    from app import create_app
    
    app = create_app()
    with app.app_context():
        try:
            init_complete_permissions()
            show_complete_permissions_matrix()
            show_role_summary()
        except Exception as e:
            print(f"❌ 初始化失败: {e}")
            db.session.rollback()
            raise
